package org.zjt.scala.book

import scala.beans.BeanProperty

/**
  *
  * Description:
  *
  *   1、对象中的private属性不能被暴露，不能被生成getter、setter方法
  *   2、非 private var【有权限的属性】 带 getter、setter 方法
  *   3、非 private val 【有权限的属性】 带 getter 方法
  *   4、自动生成 {@link BeanProperty} getter、setter 方法
  *   5、类构造器 ： 将类定义中的属性，编异字段，并生成对应的构造函数
  *   6、辅助构造器： this 方法
  *   7、伴生对象：object  类的静态内容（方法、字段）
  *
  * @author juntao.zhang
  *         Date: 2018-06-27 下午8:59
  * @see
  */
class Chapter5 {

  private var privateName: String = _  //赋值null

  @BeanProperty var addr:String = _

  val value:Int = 0 ;

  var age: Int = 0

  def name = privateName


  def setName(name: String): Unit ={
    privateName = name
  }


}

class Person{

  var name:String = _
  var age:Int = _


  /**
    * 辅助构造器
    * @param name
    * @param age
    */
  def this(name:String,age:Int){
    this()
    this.age = age
    this.name = name
  }

}


/**
  * 主要构造器，生成字段、构造器、setter、getter 等方法
  * @param name
  * @param age
  */
class Person2(@BeanProperty var name:String,@BeanProperty var age:Int){

}

/**
  * 伴生对象
  */
object Person2{

  def apply( name: String, age: Int): Person2 = new Person2(name, age)

}

object Chapter5 extends App {

  var chapter5 = new Chapter5()
  chapter5.age = 25
  println(chapter5.name)

  chapter5 setName  "zhangsan"

  println(chapter5.value)


  chapter5.setAddr("xi'an")
  println(chapter5.getAddr)


  var person2 = new Person2("zhangsan",23)
  println(person2.getAge)
  person2 setAge 26
  println(person2.getAge)


  person2 = Person2("zhangsan",23)
  println("利用伴生对象 apply 方法生成实例",person2.getName)

}